/*******************************************************************************
* Имя файла: chatClient.cpp
* Дата: 01-06-2024
* Разработчик: Андрей Подлегаев
* Группа: 315
* Факультет: ЦДО ТУСУР
* Лицензия: BSD
* Описание: Клиент-серверное приложение (ЦДО ТУСУР)
* *****************************************************************************/

#include "chatClient.h"
//TODO Сделать проверку длинны имени пользователя и соббщения!

/* Реализация функции обработки Ctrl + C */
void processCtrl(int signal)
{
  char str[MAX_LEN_MESSAGE] = "#exit";
  send(clientSocket, str, sizeof(str), 0);
  exitFlag = true;
  thSend.detach();
  thRecv.detach();
  close(clientSocket);
  exit(signal);
}

/* Реализация функции получения цвета для клиента */
Color getColor(const int& id)
{
  return static_cast<Color>(Color::COLOR_DARK_BLUE + id % Color::COLOR_WHITE);
}

/* Реализация функции удаления теста обращения к текущему пользователю */
void deleteTextRequest(const int& len)
{
  char backSpace = 8;
  for(int i{}; i < len; ++i)
    {
      std::cout << backSpace;
    }
}

/* Реализация функции вывода сообщений в терминал */
void printMessages(const std::string& str, Color color, const bool endMessages)
{
  print(str, color);
  if(endMessages) {
      std::cout << '\n';
    }
}

/* Реализация функции отправки сообщений */
void sendMessage(int clientSocket)
{
  while(true) {
      printMessages("Вы : ", COLOR_GREEN, false);

      char message[MAX_LEN_MESSAGE];

      std::cin.getline(message, MAX_LEN_MESSAGE);
      send(clientSocket, message, sizeof(message), 0);

      if(strcmp(message, "#exit") == 0)
        {
          exitFlag = true;
          thRecv.detach();
          close(clientSocket);
          return;
        }
    }
}

/* Реализация функции получения сообщений */
void receiveMessage(int clientSocket)
{
  while(true) {
      if(exitFlag) {
          return;
        }
      char nameClient[MAX_LEN_USER_NAME];
      char message[MAX_LEN_MESSAGE];
      int idClient;

      int bytesReceived = recv(clientSocket, nameClient, sizeof(nameClient), 0);

      if(bytesReceived <= 0) {
          continue;
        }
      recv(clientSocket, &idClient, sizeof(idClient), 0);
      recv(clientSocket, message ,sizeof(message), 0);
      deleteTextRequest(6);

      if(strcmp(nameClient, "#NULL") != 0) {
          printMessages(std::string(nameClient), getColor(idClient), false);
          printMessages(" : ", getColor(idClient), false);
          printMessages(message);
        }
      else {
          printMessages(message, getColor(idClient));
        }
      printMessages("Вы : ", COLOR_GREEN, false);
      fflush(stdout);
    }
}
